package com.sjb.sixteen_journey_backend.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.sjb.sixteen_journey_backend.common.JwtProperties;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.Map;

@Component
@NoArgsConstructor
@AllArgsConstructor
public class JwtUtil {

    @Autowired
    private JwtProperties jwtProperties;
    private static final String KEY = "SixteenJourneyBackend";

    //接收业务数据,生成token并返回
    public static String genToken(Map<String, Object> claims) {
        // 创建JWT令牌，设置过期时间为24小时，并使用HMAC256算法签名。
        return JWT.create()
                .withClaim("claims", claims)// 设置自定义声明，这里将整个claims映射作为"claims"声明添加到令牌中。
                .withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60* 60 * 24)) //1天过期 设置令牌的过期时间
                .sign(Algorithm.HMAC256(KEY));// 使用密钥对令牌进行签名。
    }


    //接收token,验证token,并返回业务数据
    public static Map<String, Object> parseToken(String token) {
        try {
            return JWT.require(Algorithm.HMAC256(KEY))
                    .build()
                    .verify(token)
                    .getClaim("claims")
                    .asMap();
        } catch (JWTVerificationException e) {
            throw new JWTVerificationException("Token已过期");
        }
    }

}
